/**
 * 测试UTF-8编码用，UTF-8中编码可以是不固定长度的
 * linux在终端可以用如下命令查看文本文件的编码方式：
 * file -i filename.txt
 * bugreport是用UTF-8编码的
 * 
 * 对于汉字“中”，它的Unicode码点是U+4E2D
 * 它需要用3个字节的UTF-8编码来表示，具体编码是0xE4 0xB8 0xAD。
 */
#include <fstream>
#include <iostream>
#include <locale.h> // 设置UTF-8需要的头文件(1/2)
#include <cstdlib>  // 设置UTF-8需要的头文件(2/2)

int main(){
    /**
     * UTF-8编码，下面这段代码应该输出汉字“中”，
     * 可是我得到的结果是汉字“涓”
     * 这是因为在你的编译环境中，使用默认的编码方式（例如GB2312或者GBK），而不是UTF-8编码
     * 在这种编码方式下，字节序列“0xE4 0xB8 0xAD”对应的字符是“涓”，而不是“中”
     */
    char c1=0xE4;
    char c2=0xB8;
    char c3=0xAD;
    std::cout<<"cout<<c1<<c2<<c3<<std::endl will see: ";
    /**
     * UTF-8可能前缀无重复，单纯输出某个字符的前缀
     * 无法输出有意义的字符，导致输出为空
     * 
     * UTF-8编码的前缀是不会重复的。UTF-8编码使用了一种变长编码方式
     * 其中每个字符的编码由1到4个字节组成。UTF-8编码的前缀用于指示每个字符的字节数
     * 这些前缀是不同的，因此不会重复。具体来说，UTF-8编码的前缀包括以下几种：
     * 1. 0xxxxxxx：表示单字节字符，其中x表示字符的编码
     * 2. 110xxxxx 10xxxxxx：表示双字节字符，其中x表示字符的编码
     * 3. 1110xxxx 10xxxxxx 10xxxxxx：表示三字节字符，其中x表示字符的编码
     * 4. 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx：表示四字节字符，其中x表示字符的编码
     * 由于每个前缀都是唯一的，因此不会出现重复的情况
     */
    std::cout<<c1<<std::endl;
    std::cout<<c1<<c2<<c3<<std::endl;

    /**
     * setlocale(LC_ALL, "en_US.utf8")` 是一个 C 标准库函数
     * 它的作用是设置程序的本地化信息
     * 它将程序的本地化信息设置为 "en_US.utf8"，也就是英语语言环境，并使用 UTF-8 编码
     * 但是需要注意的是，这个函数只是设置了本地化信息，它并没有改变程序的编码方式
     * 如果程序中使用了不同的编码方式，那么需要使用相应的编码转换函数来进行转换
     */
    setlocale(LC_ALL, ".utf8");
    c1=0xE4;
    c2=0xB8;
    c3=0xAD;
    std::cout<<"cout<<c1<<c2<<c3<<std::endl will see: ";
    std::cout<<c1<<c2<<c3<<std::endl;
}